//     Zepto.js
//     (c) 2010-2016 Thomas Fuchs
//     Zepto.js may be freely distributed under the MIT license.

;
(function($, undefined) {
	var document = window.document,
		origShow = $.fn.show,
		origHide = $.fn.hide,
		origToggle = $.fn.toggle

	function anim(el, speed, opacity, scale, callback) {
		if(typeof speed == 'function' && !callback) callback = speed, speed = undefined
		var props = {
			opacity: opacity
		}
		if(scale) {
			props.scale = scale
			el.css($.fx.cssPrefix + 'transform-origin', '0 0')
		}
		return el.animate(props, speed, null, callback)
	}

	function hide(el, speed, scale, callback) {
		return anim(el, speed, 0, scale, function() {
			origHide.call($(this))
			callback && callback.call(this)
		})
	}

	$.fn.show = function(speed, callback) {
		origShow.call(this)
		if(speed === undefined) speed = 0
		else this.css('opacity', 0)
		return anim(this, speed, 1, '1,1', callback)
	}

	$.fn.hide = function(speed, callback) {
		if(speed === undefined) return origHide.call(this)
		else return hide(this, speed, '0,0', callback)
	}

	$.fn.toggle = function(speed, callback) {
		if(speed === undefined || typeof speed == 'boolean')
			return origToggle.call(this, speed)
		else return this.each(function() {
			var el = $(this)
			el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback)
		})
	}

	$.fn.fadeTo = function(speed, opacity, callback) {
		return anim(this, speed, opacity, null, callback)
	}

	$.fn.fadeIn = function(speed, callback) {
		var target = this.css('opacity')
		if(target > 0) this.css('opacity', 0)
		else target = 1
		return origShow.call(this).fadeTo(speed, target, callback)
	}

	$.fn.fadeOut = function(speed, callback) {
		return hide(this, speed, null, callback)
	}

	$.fn.fadeToggle = function(speed, callback) {
		return this.each(function() {
			var el = $(this)
			el[
				(el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut'
			](speed, callback)
		})
	}

})(Zepto)